import threading


# __init__() 和 __new__()
#
# __init__():初始化对象、给对象赋值，实例化会自动调用，但不是最先调用
#
# __new__():由object提供内置静态方法、在内存中分配空间， 返回对象引用

# class Test(object):
#     def __init__(self):
#         print('init')
#     def __new__(cls, *args, **kwargs): # 重写new方法 一定要return super().__new__() 否则python 解释器得不到分配空间的对象引用
#         print('__new__')
#         print(cls)
#         print("返回值：",super().__new__(cls))
#         return super().__new__(cls)
#
# test = Test()
# print(test)

# 单例模式
# 可以理解成一个特殊的类，这个类只存在一个独享
# 优点：节省内存空间，减少不必要资源浪费
# 缺点：多线程访问容易引发线程安全问题
# 1.@classmethod
# 2.通过装饰器实现
# 3.通过重写__new__()实现（重点）
# 4.通过导入模块实现

# 2.通过装饰器实现
# class Singleton(object):
#     obj = None
#     def __new__(cls, *args, **kwargs):
#         if cls.obj is None:
#             cls.obj = super(Singleton, cls).__new__(cls)
#         return cls.obj
#
# s1 = Singleton()
# print(s1)
#
# s2 = Singleton()
# print(s2)

# 通过导入模块实现单例模式
# 模块就是天然的单例模式
from singleton import t1 as t01
from singleton import t1 as t02
print(t01)
print(t02)
#
# 应用场景
# 回收站对象
# 音乐播放器
# 开发游戏软件
# 数据库配置 数据库连接池的设计